Ograniczenie jest podobne do indeksu, chocia┐ mo┐e byµ r≤wnie┐ u┐yte do ustanowienia relacji z inn╣ tabel╣.
Mo┐na u┐yµ klauzuli CONSTRAINT w instrukcjach ALTER TABLE i CREATE TABLE ,aby dodaµ lub usun╣µ ograniczenia. Istniej╣ dwa typy klauzul CONSTRAINT: s│u┐╣ca do narzucania ogranicze± na pojedyncze pole oraz s│u┐╣ca do narzucania ogranicze± na wiΩcej ni┐ jedno pole.
Uwaga Aparat bazy danych Microsoft Jet nie obs│uguje klauzuli CONSTRAINT, ani te┐ ┐adnej z instrukcji jΩzyka definicji danych (DDL) u┐ywanych w odniesieniu do baz danych nie u┐ywaj╣cych aparatu Microsoft Jet. W przypadku takich baz nale┐y u┐yµ metody DAO Create.
Ograniczenie dla pojedynczego pola:
CONSTRAINT nazwa {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES tabela_obca [(pole_obce_1, pole_obce_2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Ograniczenie dla wielu p≤l:
CONSTRAINT nazwa
{PRIMARY KEY (podstawowe_1[, podstawowe_2 [, ...]]) |
UNIQUE (unikatowe_1[, unikatowe_2 [, ...]]) |
NOT NULL (niepuste_1[, niepuste_2 [, ...]]) |
FOREIGN KEY [NO INDEX] (odwo│anie_1[, odwo│anie_2 [, ...]]) REFERENCES tabela_obca [(pole_obce_1[, pole_obce_2 [, ...]])]}
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}
Sk│adnia klauzuli CONSTRAINT zawiera nastΩpuj╣ce elementy:
Element | Opis |
---|---|
nazwa | Nazwa tworzonego ograniczenia. |
podstawowe_1, podstawowe_2 | Nazwa pola lub p≤l, kt≤re maj╣ sk│adaµ siΩ na klucz podstawowy. |
unikatowe_1, unikatowe_2 | Nazwa pola lub p≤l, kt≤re maj╣ sk│adaµ siΩ na klucz unikatowy. |
niepuste_1, niepuste_2 | Nazwa pola lub p≤l, kt≤rych warto£ci musz╣ byµ r≤┐ne od Null. |
odes│anie_1, odes│anie_2 | Nazwa pola lub p≤l klucza obcego, czyli wskazuj╣cych na pola w innej tabeli. |
tabela_obca | Nazwa tabeli obcej zawieraj╣cej pole lub pola okre£lone przez argumenty pole_obce. |
pole_obce_1, pole_obce_2 | Nazwa pola lub p≤l w tabeli_obcej okre£lonych przez odwo│anie_1, odwo│anie_2. Mo┐esz pomin╣µ ow╣ klauzulΩ, je┐eli pola lub pole, do kt≤rego nast╣pi│o odwo│anie jest kluczem podstawowym tabeli_obcej. |
Sk│adnia ograniczenia dla pojedynczego pola w klauzuli definiuj╣cej pole w instrukcji ALTER TABLE lub CREATE TABLE, wystΩpuje zaraz po okre£leniu typu danych pola.
Sk│adnia ograniczenia dla wielu p≤l jest u┐ywana wtedy, gdy s│owo zastrze┐one CONSTRAINT wystΩpuje poza klauzul╣ definicji pola w instrukcji ALTER TABLE lub CREATE TABLE.
Za pomoc╣ klauzuli CONSTRAINT mo┐na okre£liµ dla pola nastΩpuj╣ce typy ograniczenia:
Uwaga Nie wolno ustawiaµ ograniczenia PRIMARY KEY dla tabeli, kt≤ra ju┐ ma klucz podstawowy, gdy┐ spowoduje to wyst╣pienie b│Ωdu.
Ograniczenia klucza obcego definiuj╣ okre£lone czynno£ci, kt≤re s╣ wykonywane gdy warto£µ odpowiedniego klucza podstawowego zosta│a zmieniona:
CREATE TABLE Klienci (KlientId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
Rozwa┐my nastΩpuj╣c╣ definicjΩ tabeli Zam≤wienia, kt≤ra definiuje relacjΩ klucza obcego odwo│uj╣c siΩ do klucza podstawowego tabeli Klienci:
CREATE TABLE Zam≤wienia (ZamId INTEGER PRIMARY KEY, KlientId INTEGER, ZamUwagi NCHAR VARYING (255), CONSTRAINT FKZamKlientId FOREIGN KEY (KlientId) REFERENCES Klienci ON UPDATE CASCADE ON DELETE CASCADE
Obie klauzule ON UPDATE CASCADE i ON DELETE CASCADE s╣ zdefiniowane jako klucze obce. Klauzula ON UPDATE CASCADE oznacza, ┐e je£li identyfikator klienta (KlientId) jest aktualizowany w tabeli Klienci, aktualizacja ta bΩdzie r≤wnie┐ przekazana tabeli Zam≤wienia. Ka┐de zam≤wienie zawieraj╣ce odpowiedni╣ warto£µ identyfikatora klienta bΩdzie automatycznie aktualizowane. Klauzula ON DELETE CASCADE oznacza, ┐e je£li klient jest usuwany z tabeli Klienci, wszystkie wiersze w tabeli Zam≤wienia zawieraj╣ce ten sam identyfikator klienta te┐ bΩd╣ usuniΩte.
Rozwa┐my inn╣ definicjΩ tabeli Zam≤wienia, u┐ywaj╣c czynno£ci SET NULL zamiast CASCADE:
CREATE TABLE Zam≤wienia (ZamId INTEGER PRIMARY KEY, KlientId INTEGER, ZamUwagi NCHAR VARYING (255), CONSTRAINT FKZamKlientId FOREIGN KEY (KlientId) REFERENCES Klienci ON UPDATE SET NULL ON DELETE SET NULL
Klauzula ON UPDATE SET NULL oznacza, ┐e je£li identyfikator klienta (KlientId) jest aktualizowany w tabeli Klienci, odpowiednie warto£ci klucza obcego w tabeli Zam≤wienia bΩd╣ automatycznie ustawione na NULL. Podobnie, klauzula ON DELETE SET NULL oznacza, ┐e je£li klient jest usuniΩty z tabeli Klienci, wszystkie odpowiadaj╣ce mu klucze obce w tabeli Zam≤wienia bΩd╣ automatycznie ustawione na NULL.
Aby zapobiec automatycznemu tworzeniu siΩ indeks≤w dla kluczy obcych, mo┐na u┐yµ modyfikatora NO INDEX. Ta forma definicji klucza obcego powinna byµ u┐yta tylko w wypadku, gdy warto£ci indeksu wynikowego by│yby czΩsto duplikowane. W wypadku, gdy warto£ci w indeksie klucza obcego s╣ czΩsto duplikowane, u┐ycie indeksu mo┐e byµ mniej wydajne ni┐ zwyk│e przegl╣danie tabeli. Obs│ugiwanie indeksu tego typu, z wierszami dodawanymi i usuwanymi z tabeli, obni┐a wydajno£µ i nie przynosi ┐adnej korzy£ci.
CREATE TABLE - instrukcja, CONSRAINT - klauzula - przyk│ad